#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

int main()
{
    //stdout和stderr的fd中文件地址都是显示屏文件，但各自的fd不同,
    //所以在进行重定向时，就可以做到往两个文件中分别打印各自数据，互不干扰
    printf("hello printf\n");
    perror("hello error");
    
    std::cout << "hello std::cout" << std::endl;
    std::cerr << "hello std::cerr" << std::endl;

    return 0;
}

//int main()
//{
//    const char* s1 = "hello printf\n";
//    printf(s1);
//   
//    const char* s2 = "hello fprintf\n";
//    fprintf(stdout, s2);
//
//    const char* s3 = "hello fwrite\n";
//    fwrite(s3, strlen(s3), 1, stdout);
//    //上面往显示屏文件刷新时是行刷新
//    //而往log.txt普通文件中刷新是全刷新
//    //所以在log.txt中先打印系统调用的内容，在打印其他三个在语言缓冲区的内容
//    //又因为有两个进程，就会对缓冲区进行两次刷新，也就是出现两遍的原因
//    
//    //系统调用:直接刷新到文件内核缓冲区中，只刷新一次
//    const char* s4 = "hello write(syscall)\n";
//    write(1, s4, strlen(s4));
//    
//    //创建子进程
//    fork();
//    //父子进程退出，会刷新两次语言级缓冲区
//    //在刷新缓冲区的时候会发生写时拷贝，所以他们刷新的都是自己的缓冲区
//    
//    return 0;
//}
